fn main() {
    
    // test01();

    // test02();

    // test03();

    test04();
}

// 变量声明
fn _test01() {

    // `let =` 是变量绑定，与其他语言的声明操作类似
    // 但由于 Rust 引入了所有权的概念，所以绑定更形象
    let a = "abc".to_string();

    // Rust 默认变量不可变（六...
    // 使用 mut 将变量指明为可变型变量
    let mut b = "ccc";

    let c = a + b;
    println!("{}", c);
}

// 解构赋值
fn test02() {
    let (a, mut b): (bool,bool) = (true, false);
    // a = true,不可变; b = false，可变
    println!("a = {:?}, b = {:?}", a, b);

    b = true;
    assert_eq!(a, b);
}

// 常量声明
fn test03() {
    // 使用 const 声明
    // 声明时需要指定数据类型
    const NUM_CONST: i64 = 1000_000_i64;

    println!("{}", NUM_CONST);
}

// 变量遮蔽
fn test04() {
    let x = 5;
    // 在 test04 函数的作用域内对之前的x进行遮蔽
    let x = x + 1;

    test04_02(x);

    {
        // 在当前的花括号作用域内，对之前的x进行遮蔽
        let x = x * 2;
        println!("The value of x in the inner scope is: {}", x);
    }

    println!("The value of x is: {}", x);
}

// 变量遮蔽方法参数测试
fn test04_02(num: i32) {
    let num = num * 3;
    println!("The value of num is: {}", num);
}
